13 腾讯-一面-腾讯金融科技
> Last Format Time:6/12/2026 21:03:57
提问
大量的提问有关Agent
- 如何验证最后的结果
- 怎么优化写文档的过程呢
- react的原理
- fiber架构
- 打包工具的原理
- vite与wpck区别
- 热更新原理
代码
题目
// 异步加法
function asyncAdd(a, b, cb) {
setTimeout(() => {
cb(null, a + b)
}, Math.random() * 1000)
}
async function total() {
const res1 = await sum(1, 3, 5, 7, 9, 1, 3, 5, 7, 9);
const res2 = await sum(1, 3, 5, 7, 9, 1, 3, 5, 7, 9);
console.log([res1, res2])
return [res1, res2]
}
total()
async function sum(...args) {
// TODO 实现下 sum 函数。注意不能使用加法,在 sum 中借助 asyncAdd 完成加法。尽可能的优化这个方法的时间。
}
我的实现
// 异步加法
function asyncAdd(a, b, cb) {
setTimeout(() => {
cb(null, a + b)
}, Math.random() * 1000)
}
async function total() {
const res1 = await sum(1, 3, 5, 7, 9, 1, 3, 5, 7, 9);
const res2 = await sum(1, 3, 5, 7, 9, 1, 3, 5, 7, 9);
console.log([res1, res2])
return [res1, res2]
}
total()
const promisedAdd = (a, b) => {
let promise = new Promise((resolve, reject) => {
const fn = (arg1, sum) => {
resolve(sum)
// reject(arg1)
}
let res = asyncAdd(a, b, fn)
}).then((sum) => {
return sum
}).finally(() => {
return null
})
return promise
}
async function sum(...args) {
// TODO 实现下 sum 函数。注意不能使用加法,在 sum 中借助 asyncAdd 完成加法。尽可能的优化这个方法的时间。
let n = args.length
let ans = 0
if (n === 0) {
return 0
}
let arr = args.slice()
// let promises = []
let promise = new Promise(async (resolve, reject) => {
for (let i = 0; i < n; i++) {
ans = await promisedAdd(ans, arr[i])
}
resolve(ans)
}).then((ans) => {
return ans
})
return promise
}
标准实现
// 异步加法
function asyncAdd(a, b, cb) {
setTimeout(() => {
cb(null, a + b)
}, Math.random() * 1000)
}
async function total() {
const res1 = await sum(1, 3, 5, 7, 9, 1, 3, 5, 7, 9);
const res2 = await sum(1, 3, 5, 7, 9, 1, 3, 5, 7, 9);
console.log([res1, res2])
return [res1, res2]
}
total()
// 实现 sum 函数
async function sum(...args) {
// 边界条件:没有参数返回0,只有一个参数直接返回该参数
if (args.length === 0) return 0;
if (args.length === 1) return args[0];
// 边界条件:如果只有两个参数,直接调用 asyncAdd 相加
if (args.length === 2) {
return new Promise((resolve) => {
asyncAdd(args[0], args[1], (_, res) => resolve(res));
});
}
// 二分法:将数组从中间劈开,分成左右两部分
const mid = Math.floor(args.length / 2);
const leftArgs = args.slice(0, mid);
const rightArgs = args.slice(mid);
// 并行计算左右两部分的和(递归调用)
// Promise.all 会让左右两边的计算同时开始,而不是等左边算完再算右边
const [leftSum, rightSum] = await Promise.all([
sum(...leftArgs),
sum(...rightArgs)
]);
// 最后将左右两边的结果相加
return new Promise((resolve) => {
asyncAdd(leftSum, rightSum, (_, res) => resolve(res));
});
}
反思
完蛋。。。
并非完蛋,上一个面试官给我很高的评价,我都惊了,这对吗?感觉二面完蛋